import axios from 'axios'


// 设置基地址
const request = axios.create({
    baseURL: 'http://toutiao.itheima.net/'
})


// 导入store
import store from '@/store'
//导入Toast
import {
    Toast
} from 'vant';
//导入router
import router from '@/router'

// 我们项目里发请求用的是request对象，所以你要拦截，也应该是拦截request
request.interceptors.request.use(function (config) {

    // 这个函数会在正常请求时拦截下来（请求即将发出时拦截下来，调用这个函数）
    // 参数config就是你本次请求的请求信息
    // console.log(123, config)

    // 如果有token才加这个请求头，不然不加（例如登录就没有token）
    if (store.state.tokenObj.token) {
        // 请求发出前，给请求头携带好token
        config.headers.Authorization = 'Bearer ' + store.state.tokenObj.token
    }

    // 在发送请求之前做些什么
    return config;

}, function (error) {

    // 发请求出错调用的函数（用不到，可以无视）
    // 对请求错误做些什么
    return Promise.reject(error);
});


// 添加响应拦截器
request.interceptors.response.use(function (response) {
    // 对响应数据做点什么
    return response;
    // return lele
}, async function (error) {
    // 服务器网络不通报错，你也给我去刷新token就不合理
    // 所以我们要判断，只能是token失效的错误，才做如下处理
    if (error.response.status === 401) {

        // 写代码发请求，利用refresh_token去请求一个新的token
        // 如果用reqest对象发请求，就会触发request的请求拦截
        // 而触发请求拦截后会把Authorization里的refresh_token给重新赋值覆盖掉
        // 所以服务器要报错,所以直接用axios对象发请求，但是这时候要设置完整地址

        //可能报错代码放在try里面
        try {
            let res = await axios({
                url: 'http://toutiao.itheima.net/v1_0/authorizations',
                method: 'put',
                headers: {
                    Authorization: 'Bearer ' + store.state.tokenObj.refresh_token
                }
            })

            // 请求到后，再把新的token存到vuex和本地存储
            // 这里不能直接存res.data.data，因为这里只有token
            // 如果你直接存了就会把我们的refresh_token弄没了
            // 所以我们需要手动写一个对象，里面包含token和之前的refresh_token
            store.commit('setToken', {
                token: res.data.data.token,
                refresh_token: store.state.tokenObj.refresh_token
            })

            // 得到新的token后，我们就直接再次写代码利用新的token
            // 把之前token过期的那个请求再用新token请求一次
            // 得到结果后，再把结果return出去
            // 如何把之前你发的旧token的请求再利用新token发一次呢？
            // error对象里的config就拥有之前请求的所有信息
            // 所以利用config再发一次请求即可
            let newRes = await request(error.config)
            return newRes
        } catch {
            // 进来这边 证明上面请求有错, 那进一步说就是refresh_token过期了. 
            // 所打回去登录页面,弹出窗口让他重新登录.
            Toast.fail('冠希哥过期了,重新登录吧')
            router.push('/login')


        }
    } else {
        // 对响应错误做点什么
        return Promise.reject(error);
    }


});




// 把对象暴露出去
export default request